[数值分析拟合]Matlab三次样条插值拟合数据 您所在的位置:网站首页 拟合曲线函数 样条 [数值分析拟合]Matlab三次样条插值拟合数据

[数值分析拟合]Matlab三次样条插值拟合数据

2024-02-24 15:06| 来源: 网络整理| 查看: 265

           三次样条插值是一种运用极为广泛的工程插值算法,本文章编写的函数默认使用端点处的导数值代替给定的两端点的导数值使用三转角构造法进行插值(该函数也可传入端点导数数值进行分析),对数据进行方便而迅速的拟合(但是目前没有三弯矩构造法)

        一、三次样条插值的基本原理:

        首先,三次样条插值将曲线的每一段通过三次函数进行拟合。曲线会通过每一个数据点,并且在每个数据点处都有二阶连续条件(节点处的一阶导数值和二阶导数值均相同),当已知n+1个数据点时,可以设前n个节点的三次函数分别为S_i(x)=A_i+B_i(x-x_{i})+C_i(x-x_i)^2+D_i(x-x_i)^3  (i=1,2,...n)其中有4n个未知数,需要建立4n个方程来解决(下面是自己整理的总体思路,因为也是第一次写比较多的公式,如有错误和不妥之处请在评论区指正)

1) 首先有A_i=S_i(x)  (i=1,2,...n),(通过值条件)可建立n个方程,即A_i=y_i

2) 由S_{i}(x_{i+1})=S_{i+1}(x_{i+1}) (i=1,2,...n) (连续性条件)建立n个方程

3) 使用内节点处导数连续条件,即S'_i(x_{i+1})=S'_{i+1}(x_{i+1})(i=1,2,...n-1),由求导可得S'_i(x_i)=B_i+2C_i(x_i-x)+3D_i(x_i-x)^2

h_i=x_{i+1}-x_{i},

则有S'_i(x_i)=B_i

故可利用上式得出

B_i+2C_ih_i+3D_ih_i^2-B_{i+1}=0,

这样就建立了n-1个节点处导数连续的方程

3)同样地,解出二阶导数,并使S''_i(x_{i+1})=S''_{i+1}(x_{i+1})得到2C_i+6h_i*D_i-2C_{i+1}=0

其中设m_i=2C_i=S''_{i}(x)为该点处的二阶导数值,可建立n-1个相应的方程组

于是,这样对一条插值曲线的4n个未知数就产生了4n-2个约束,另外两个约束由边界条件确定

通过边界条件等4n个方程将Ai,Bi,Ci,Di用mi表示,建立方程组解出m,从而确定共4n个未知数的值,构造出每一段的三次曲线方程

        二、简介三转角构造法和三弯矩构造法

1)   三转角构造法:采用两端的导数值作为边界条件建立2个补充方程

2)三弯矩构造法:给出两端点的二阶导数值,作为补充的2个边界条件

其余的还有自然边界法等方法,这个方法会在下方的文章链接里面有详细解释

        三、详细的推导过程可以参考下面这篇文章:

****************************************

三次样条插值的原理和C语言实现

****************************************

另外这篇文章的一部分内容也是有一些比较难以推导的部分和误区,在这里补充如下:

在上述文章的【端点条件】中(端点条件即为使用三转角构造法),有推导过程

他的第二式b0=A是这样推导的:

1)利用前面的式子b.   b_i=\frac{y_{i+1}-y_i}{h_i}-\frac{h_i}{2}m_i-\frac{h_i}{6}(m_{i+1}-m_i)    (1)

可获得b0为上式值

2)所给出的边界条件中,这一张里面下标应当为bn=B(是最后一个节点的),通过这个推导下方的式子hn-1.....这里要用到导数连续条件b_{i}=b_{i-1}+2c_{i-1}h_{i-1}+3d_{i-1}h_{i-1}^2     (2)

(有c_i=\frac{m_{i}}{2},d_i=\frac{m_{i+1}-m_i}{6h_i}

 将(1)式中的i换成n-1代入(2)式(i=n)中,即可得到图中的第二个式子

        四、代码部分

下面附上完整的程序:

1)首先要在该函数的文件夹下创建一个函数len.m以便于后期取长度时调用

%返回一维数组长度(行数或列数其中大的一个,必须是一位数组) function [length]=len(A) s=size(A); if s(2)==1 length=s(1); %取行 end if s(1)==1 length=s(2); end if s(1)~=1 && s(2)~=1 disp('必须是单行向量或单列向量') return end end

2)Spline_3.m   (三次样条插值主函数)

%三次样条插值的matlab实现 %本例为三转角构造法,需要给出边界处的导数值 %本函数默认使用边界两点的斜率拟合最后一点的导数值 %一般默认调用方法为:[x2,y2] = Spline_3(x,y) , 若直接使用 Spline_3(x,y)则绘图 %指定端点导数值调用方法: [x2,y2] = Spline_3(x,y,'dx',[1,-1]) function [x2,y2]=Spline_3(x,y,String,dx) %传入 x y 矩阵和初始参数,(默认使用三转角构造,若传入三个参数,则指定两段的导数值, %四个参数指定两端的二阶导数值(此时第三个参数无效)(目前没有实现三弯矩构造) n=len(x); if nx(j+1) %变换插值函数 j=j+1; end y2(i)=A(j) +B(j)*(x_2(i)-x(j)) +C(j)*(x_2(i)-x(j))^2 + D(j)*(x_2(i)-x(j))^3; end %end %三转角构造方式 x2=x_2; if nargout==0 plot(x2,y2) end end

用法示例1:三次样条插值cos

%这个是一般的最简便调用格式 t=0:1:10; y=cos(t); Spline_3(t,y) %绘制三次样条插值曲线 %下面是可以返回需要的t2和y2值 t=0:1:10; y=cos(t); [t2,y2]=Spline_3(t,y) plot(t2,y2)

结果:

 用法2:传入端点处的一阶导数值

t=0:1:10; y=cos(t); Spline_3(t,y,'dx',[10,-10]); %这样可以指定传入首尾端点的导数值,按照首尾的导数去插值 %最后一种就是带返回值,懂的都懂AWA

结果(修改了cosx插值的端点导数):

 (这当然还是满足1,2,等过相应的值)

 五、实际应用

主要用于处理和模拟实验数据是极有效的模拟方式,我会最近发布一篇文章《三次样条插值整理实验数据》来对此做一步应用,有兴趣者可以参考

[matlab实践应用]matlab实现读取xls表格并三次样条插值拟合压杆稳定实验数据



【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有